package impl;

import Clases.CriterioOrdenamiento;
import Clases.InfoAutor;
import Clases.Libro;
import TDA.AutoresTDA;
import TDA.LibrosTDA;

public class AutoresImpl implements AutoresTDA {

	private CriterioOrdenamiento criterioOrd;
	
	private class Nodo {
		InfoAutor autor;
		AutoresTDA autoresIzq;
		AutoresTDA autoresDer;
	}
	
	Nodo raiz;
	 
	public void InicializarAutores(CriterioOrdenamiento c) {
		raiz = null;
		this.criterioOrd = c;
	}
	
	//LOS AUTORES ESTAN ORDENADOS ALFABETICAMENTE
	public void AgregarAutor(String nAutor) {                  
		/*/instancio un infoAutor y lo agrego al arbol*/
		if(raiz==null){
			InfoAutor nuevo = new InfoAutor();
			nuevo.setNombre(nAutor);
			LibrosTDA libros = new LibrosImpl();
			libros.InicializarLibros(criterioOrd);
			nuevo.setLibros(libros);
			raiz = new Nodo();
			raiz.autor=nuevo;
			raiz.autoresDer = new AutoresImpl();
			raiz.autoresIzq = new AutoresImpl();
			raiz.autoresDer.InicializarAutores(criterioOrd); 
			raiz.autoresIzq.InicializarAutores(criterioOrd); 
			System.out.println("se agrego el autor!!!");
		} else {
			if(raiz.autor.getNombre().compareTo(nAutor)>0){ 
				raiz.autoresIzq.AgregarAutor(nAutor);
			}else {
				if(raiz.autor.getNombre().compareTo(nAutor)<0)
					raiz.autoresDer.AgregarAutor(nAutor);
			}
		}
	}

	public void AgregarLibro(String nAutor, Libro l) {
		LibrosTDA libros = new LibrosImpl();
		libros.InicializarLibros(criterioOrd);
		InfoAutor autor = raiz.autor;
		if(autor.getNombre().compareTo(nAutor)==0){
			if(autor.getLibros()==null){
				//no hay ningun libro en el arbol, entonces lo tengo que agregar en la raiz				
				libros.AgregarLibro(l);
			}else{
				libros = autor.getLibros();
				libros.AgregarLibro(l);
			}
			autor.setLibros(libros);
		} else {
				if(autor.getNombre().compareTo(nAutor)>0)
					raiz.autoresIzq.AgregarLibro(nAutor, l);
				else
					raiz.autoresDer.AgregarLibro(nAutor, l);
		}
	}


	public AutoresTDA AutoresHijoIzq() {
		return raiz.autoresIzq;
	}

	public AutoresTDA AutoresHijoDer() {
		return raiz.autoresDer;
	}

	public void EliminarAutor(String nAutor) {
		if(raiz != null) {
			if (raiz.autor.getNombre()==nAutor && raiz.autoresIzq.AutoresVacio()&& raiz.autoresDer.AutoresVacio()){
				raiz = null;
			} else {
				if(raiz.autor.getNombre()==nAutor && !raiz.autoresIzq.AutoresVacio()){
					raiz.autor = mayor(raiz.autoresIzq);
					raiz.autoresIzq.EliminarAutor(raiz.autor.getNombre());
				} else {
					if(raiz.autor.getNombre()== nAutor && raiz.autoresIzq.AutoresVacio()){
						raiz.autor = menor(raiz.autoresDer);
						raiz.autoresDer.EliminarAutor(raiz.autor.getNombre());
					} else {
						if(raiz.autor.getNombre().compareTo(nAutor)> 0){
							raiz.autoresIzq.EliminarAutor(nAutor); 
						} else {
							raiz.autoresDer.EliminarAutor(nAutor);
						}
					}
				}
			}
		} 
	} 

		
	private InfoAutor menor(AutoresTDA autores) {
		if(autores.AutoresHijoIzq().AutoresVacio())
			return autores.raiz();
		else
			return menor(autores.AutoresHijoIzq());
	}

	private InfoAutor mayor(AutoresTDA autores) {
		if(autores.AutoresHijoDer().AutoresVacio())
			return autores.raiz();
		else
			return mayor(autores.AutoresHijoDer());
	}

	
	public void EliminarLibro(String nAutor, Libro l) {
		InfoAutor autor = raiz.autor;
		if(autor.getNombre().compareTo(nAutor)==0){
			LibrosTDA libros = new LibrosImpl();
			libros.InicializarLibros(criterioOrd); 
			libros = autor.getLibros();
			libros.ElimnarLibro(l);
			autor.setLibros(libros);
		} else {
			if(autor.getNombre().compareTo(nAutor)>0)
				raiz.autoresIzq.EliminarLibro(nAutor, l);
			else
				raiz.autoresDer.EliminarLibro(nAutor, l);
		}
	}
	
	public boolean AutoresVacio() {
		return raiz == null;
	}

	public InfoAutor raiz() {
		return raiz.autor;
	}

	

}
